Python Paddlepaddle模型转onnx模型并验证

代码方式转化

注意定义输入个数据格式地方,InputSpec([1, 1, 28, 28], ‘float32’, ‘x’) ,此处按照实际情况编写,和后面的使用的输入要保持一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
import time
import paddle
from paddle.static import InputSpec

model = paddle.jit.load("./testfive/mnist_checkpoint/test")
model.eval() # 设置为预测模型

# 将模型设置为评估状态
model.eval()

# 定义输入数据

#x_spec = InputSpec([None, 784], 'float32', 'x')
x_spec = InputSpec([1, 1, 28, 28], 'float32', 'x')
# ONNX模型导出
paddle.onnx.export(model, './testfive/onnxSave/linear_net',input_spec=[x_spec])

输出

1
2
3
4
5
6
7
8
9

[INFO] Static PaddlePaddle model saved in ./testfive/onnx.save\paddle_model_static_onnx_temp_dir.
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: ./testfive/onnx.save\paddle_model_static_onnx_temp_dir\model.pdmodel
[Paddle2ONNX] Paramters file path: ./testfive/onnx.save\paddle_model_static_onnx_temp_dir\model.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 9 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
[INFO] ONNX model saved in ./testfive/onnx.save/linear_net.onnx.

保存文件的地址

1
D:\vsCodeWorkspace\pythonpaddleNumber\testfive\onnxSave\linear_net.onnx

模型验证

1
2
3
4
5
6
7
8
9
10
# 导入 ONNX 库
import onnx
# 载入 ONNX 模型
#onnx_model = onnx.load("./testfive/onnx/test.onnx")
onnx_model = onnx.load("./testfive/onnxSave/linear_net.onnx")

# 使用 ONNX 库检查 ONNX 模型是否合理
onnx.checker.check_model(onnx_model)

# onnx.checker.check_model 不报错则证明onnx 网格没问题

运行之后 onnx.checker.check_model 不报错则证明没有任何问题

模型使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 静态图导出的ONNX模型测试
import time
import paddle
import numpy as np
from paddle.vision.transforms import Compose, Normalize
from paddle.metric import Accuracy
from onnxruntime import InferenceSession
import cv2

# 加载ONNX模型
model = InferenceSession('./testfive/onnxSave/linear_net.onnx')
#model = InferenceSession('./testfive/onnx/test.onnx')

#model.eval() # 设置为预测模型

# 使用transform对数据集做归一化
transform = Compose([Normalize(mean=[127.5], std=[127.5], data_format='CHW')])
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
# train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)

img1,label1 = test_dataset[0];

x = np.array([img1])
print(x.shape)

print("x---------------------------------------------")
#print(x)
#pre = model.run(output_names=None, input_feed={'inputs': img1})
pre = model.run(output_names=None, input_feed={'x': x})
print("预测数字:", np.argmax(pre)) # 输出预测数字

print("真实数字:", label1) # 输出真实数字

注意 x.shape 必须为上述要求的输入格式,不然会有下面的报错

1
2
INVALID_ARGUMENT : Invalid rank for input: modelInput Got: 3 Expected: 4 
Please fix either the inputs or the model

输出

[W:onnxruntime:, graph.cc:108 onnxruntime::MergeShapeInfo] Error merging shape info for output. 'translated_layer/scale_0.tmp_1' source:{1,10} target:{64,10}. Falling back to lenient merge.
x1---------------------------------------------
(1, 1, 28, 28)
x---------------------------------------------
预测数字: 7
真实数字: [7]

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

继开 wechat
欢迎加我的微信,共同交流技术